<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Эмулятор БК 0010(01)</title>
<style type="text/css">
<!--
body {
	background: #eee;
}
h2 {
	font: bold x-large Arial, Helvetica, sans-serif;
	text-align: center;
}
h3 {
	font: italic bold medium Arial, Helvetica, sans-serif;
	text-align: left;
}
.content {
	margin: 0 auto 2em;
	padding: 1em;
	background: white;
	color: black;
	border: 1px solid #aaa;
	text-align: left;
	width: 20cm;
}
p {
	text-align: justify;
}
.pstruc {
	margin-bottom: 0;
}
.bl {
	color: #0066FF;
}
.keywd {
	color: #0000FF;
}
.varnm {
	color: #000066;
}
th {
	color: #FFFFFF;
	background: #666666;
}
-->
</style>
</head>
<body>
<div class="content">
  <h2>Формат файла .MSF версии 1.3 (Memory state file)<br />
    для эмулятора БК 0010(01) и БК 0011(М) </h2>
  <p>Файлы данного формата обычно хранят в себе полный слепок всей памяти БК
    на момент сохранения, состояние регистров, уменьшенную копию экрана, а также
    любую другую необходимую для последующего восстановления информацию. Формат
    является бинарным, и представляет собой теговую структуру. Каждый тег представляет
    собой заголовок, и данные некоторого типа. Теги могут располагаться в любом
    порядке (кроме первого заголовочного тега <span class="bl">MSF_FILE_HEADER</span>),
    а также быть вложенными один в другой. Теоретически любой из тегов может
    быть пропущен, а также могут присутствовать теги, которые незнакомы эмулятору
    данной версии, и будут без проблем пропущены. Таким образом теоретически
    осуществляется совместимость форматов разных версий в обе стороны.</p>
  <h3>Формат заголовочного тега:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_FILE_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%"></td>
      <td width="10%"><span class="keywd">DWORD</span></td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">- тип файла всегда равен (<span class="bl">STATE_ID</span> ==
        65536)</td>
    </tr>
    <tr valign="top">
      <td></td>
      <td><span class="keywd">DWORD</span></td>
      <td><span class="varnm">version</span>;</td>
      <td>- версия файла: 10 – 1.0, 15 – 1.5, 20 – 2.0,
        и т.д. В настоящее  время версия файла 1.3 (13) и более ранние версии
        не поддерживаются.</td>
    </tr>
    <tr valign="top">
      <td></td>
      <td><span class="keywd">DWORD</span></td>
      <td><span class="varnm">configuration</span>;</td>
      <td>- конфигурация компьютера:
        <ol>
          <li> БК 0010(01) с БЕЙСИКом “Вильнюс 1986”</li>
          <li> БК 0010(01) с блоком МСТД</li>
          <li> БК 0010(01) с дополнительным блоком ОЗУ 32Кб</li>
          <li> БК 0010(01) с контроллером НГМД</li>
          <li> БК 0011М</li>
          <li> БК 0011М с контроллером НГМД</li>
          <li> БК 0011</li>
          <li>БК 0011М с контроллером НГМД</li>
        </ol></td>
    </tr>
  </table>
  };
  <p>Далее следуют теги для конкретной конфигурации.</p>
  <h3>Формат тега:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span></td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">- тип тега</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span></td>
      <td><span class="varnm">length</span>;</td>
      <td>- длина в файле, занимаемая им вместе с заголовком</td>
    </tr>
  </table>
  };
  <p>За тегом сразу следуют данные. Теги бывают следующих типов:</p>
  <table border="1" cellspacing="1" cellpadding="4" width="720">
    <tr class="tblhdr">
      <th width="10%" valign="top">Имя</th>
      <th width="5%" valign="top">Тип</th>
      <th width="15%" valign="top">Длина (байт)</th>
      <th width="70%" valign="top">Комментарий</th>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_UNKNOWN</span></td>
      <td>-1</td>
      <td>8 и более</td>
      <td>неизвестный блок. Просто пустая болванка, сделан на всякий
        случай</td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_BASEMEMORY</span></td>
      <td>0</td>
      <td>8 + 64&nbsp;Кб</td>
      <td>блок памяти основного 64&nbsp;Кбайтного пространства. Вся память
        с 0 – 0200000, то, что в ней находится в текущий момент. В версии 1.0 вместе
        с системными регистрами, в версии 1.1 системные регистры сохраняются в
        отдельном блоке </td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_CPU_REGISTERS</span></td>
      <td>1</td>
      <td>8 + 18</td>
      <td>Регистры процессора: R0 – R5, SP, PC, PSW</td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_PREVIEW</span></td>
      <td>2</td>
      <td>&nbsp;</td>
      <td>Малая копия экрана. См. описание ниже</td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_10EXT16</span></td>
      <td>3</td>
      <td>8 + 24Кб</td>
      <td>Блок расширенной памяти КНГМД А16М 16К ОЗУ + 8К ПЗУ. </td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_10EXT32</span></td>
      <td>4</td>
      <td>8 + 32Кб</td>
      <td>Страницы расширенной памяти 32К. Располагается с адресов
        0120000 – 140000</td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_11EXT64</span></td>
      <td>5</td>
      <td>&nbsp;</td>
      <td>Страницы расширенной памяти 64К для БК11М. Формат не определён. <strong>Устарел. Зарезервирован. </strong> </td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_PORT_REGS</span></td>
      <td>6</td>
      <td>8 + 30 </td>
      <td>(Начиная с версии 1.1) Блок размещения системных регистров
        177660, 177662, 177664, 177700-177716 </td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_MEMMAP</span></td>
      <td>7</td>
      <td>8 + 16*20 + 16</td>
      <td>(Начиная с версии 1.1) Карта памяти, в которой обозначено,
        какие страницы и банки памяти куда подключены. </td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_BASEMEMORY11M</span></td>
      <td>8</td>
      <td>8 + 0700000</td>
      <td>(Начиная с версии 1.1) Весь блок памяти БК 11М, включая
        доп. ПЗУ + ПЗУ контроллера А16М и доп. ОЗУ</td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_MEMORY_SMK512</span></td>
      <td>9</td>
      <td>8 + (512-16)*1024</td>
      <td>(Начиная с версии 1.1) Блок памяти ОЗУ контроллера СМК-512.
        Т.к. 16&nbsp;Кб уже сохраняется в блоках №3 и №8, то здесь сохраняется 512&nbsp;Кб-16&nbsp;Кб </td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_CONFIG</span></td>
      <td>10</td>
      <td>8 + заранее не известно</td>
      <td>(Начиная с версии 1.2) Структура g_config.<br />
        (Начиная с версии 1.3)<br />
        текстовый файл конфигурации со всеми текущими настройками. </td>
    </tr>
    <tr valign="top">
      <td><span class="bl">MSF_BLOCKTYPE_WAVE</span></td>
      <td>200</td>
      <td>8 + заранее не известно</td>
      <td>Используется в tap файлах для хранения контента.</td>
    </tr>
  </table>
  <h3>Формат тега MSF_BLOCKTYPE_BASEMEMORY (Тип 0) “Блок памяти 
    основного 64&nbsp;Кбайтного пространства”:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span></td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };
  <p>Далее следуют 64&nbsp;Кбайта основной памяти в диапазоне адресов 0 – 200000.</p>
  <h3>Формат тега MSF_BLOCKTYPE_CPU_REGISTERS (Тип 1) “Регистры 
    процессора”:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };
  <p class="pstruc"><span class="keywd">struct MSF_CPU_REGISTERS</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">WORD</span> </td>
      <td width="15%"><span class="varnm">r0</span>;</td>
      <td width="70%">- регистр общего назначения R0</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">r1</span>;</td>
      <td>- регистр общего назначения R1</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">r2</span>;</td>
      <td>- регистр общего назначения R2</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">r3</span>;</td>
      <td>- регистр общего назначения R3</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">r4</span>;</td>
      <td>- регистр общего назначения R4</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">r5</span>;</td>
      <td>- регистр общего назначения R5</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">sp</span>;</td>
      <td>- регистр стека SP</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">pc</span>;</td>
      <td>- регистр команд PC</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">psw</span>;</td>
      <td>- слово состояния процессора PSW</td>
    </tr>
  </table>
  };
  <h3>Формат тега MSF_BLOCKTYPE_PREVIEW (Тип 2) “Малая копия экрана”:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };&nbsp;
  <p class="pstruc"><span class="keywd">struct BITMAPINFOHEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="25%"><span class="varnm">biSize</span> =
        40;</td>
      <td width="60%">- размер структуры <span class="bl">BITMAPINFOHEADER</span></td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">biWidth</span> =
        200;</td>
      <td>- всегда 200</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">biHeight</span> =
        200;</td>
      <td>- всегда 200</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">biPlanes</span> =
        1;</td>
      <td>- всегда 1 (1 плоскость);</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">biBitCount</span> =
        32;</td>
      <td>- кол-во бит на пиксель (любое допустимое кол-во
        бит)</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">biCompression</span> =
        0;</td>
      <td>- всегда 0 (без компрессии)</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">biSizeImage</span> =
        0;</td>
      <td>- не используется</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">biXPelsPerMeter</span> =
        0;</td>
      <td>- не используется</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">biYPelsPerMeter</span> =
        0;</td>
      <td>- не используется</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">biClrUsed</span> =
        0;</td>
      <td>- не используется</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">biClrImportant</span> =
        0;</td>
      <td>- не используется</td>
    </tr>
  </table>
  };
  <p>Далее следует непосредственно массив бит картинки. Картинка записывается в
    перевёрнутом по вертикали виде, где каждая строка выровнена на границу 4-х
    байт.</p>
  <h3>Формат тега MSF_BLOCKTYPE_10EXT16 (Тип 3) “Блок расширенной 
    памяти КНГМД А16М 16К ОЗУ + 8К ПЗУ”:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };
  <p>Для версии 1.0: </p>
  <p><span class="keywd">DWORD</span> <span class="varnm">bBasic</span> - флаг,
    включено ли ПЗУ (0 – нет, 1 – да)</p>
  <p>Далее следуют 24&nbsp;Кбайта памяти при установленном флаге <span class="varnm">bBasic</span> в
    1 (обычно ПЗУ 24К бейсика)</p>
  <p>Далее следуют 24&nbsp;Кбайта памяти при установленном флаге <span class="varnm">bBasic</span> в
    0 (обычно ДОЗУ 16К + ПЗУ НГМД 8К)</p>
  <p>Начиная с версии 1.1:</p>
  <p>Далее следуют 24&nbsp;Кбайта памяти при установленном флаге <span class="varnm">bBasic</span> в
    0 (обычно ДОЗУ 16К + ПЗУ НГМД 8К) </p>
  <h3>Формат тега MSF_BLOCKTYPE_10EXT32 (Тип 4) “Страницы расширенной 
    памяти 32К”:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };
  <p><span class="keywd">DWORD</span> <span class="varnm">nPage</span> - номер
    подключенной страницы 0 – 3</p>
  <p>Далее следуют 32&nbsp;Кбайта дополнительной памяти</p>
  <h3>Формат тега MSF_BLOCKTYPE_PORT_REGS (Тип 6) “Системные 
    регистры”:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };&nbsp;
  <p class="pstruc"><span class="keywd">struct MSF_PORT_REGS</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">WORD</span> </td>
      <td width="20%"><span class="varnm">p0177660</span>;</td>
      <td width="65%">- регистр состояния клавиатуры </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177662_in</span>;</td>
      <td>- регистр данных клавиатуры </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177662_out</span>;</td>
      <td>- регистр палитр, буфера экрана и таймер по
        вектору 100 (только на БК11(М)) </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177664</span>;</td>
      <td>- регистр смещения </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177700</span>;</td>
      <td>- регистр режима </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177702</span>;</td>
      <td>- регистр адреса прерывания </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177704</span>;</td>
      <td>- регистр ошибки</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177706</span>;</td>
      <td>- регистр установки таймера </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177710</span>;</td>
      <td>- регистр счётчика таймера </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177712</span>;</td>
      <td>- регистр управления таймером </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177714_in</span>;</td>
      <td>- входной регистр порта ввода вывода </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177714_out</span>;</td>
      <td>- выходной регистр порта ввода вывода</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177716_in</span>;</td>
      <td>- регистр порта по чтению (чтение с МФ или с
        линии) </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177716_out_tap</span>;</td>
      <td>- регистр порта по записи (запись на МФ или
        в линию) </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">WORD</span> </td>
      <td><span class="varnm">p0177716_out_mem</span>;</td>
      <td>- регистр порта по записи (установка страниц
        памяти, на БК11(М)) </td>
    </tr>
  </table>
  };
  <h3>Формат тега MSF_BLOCKTYPE_MEMMAP (Тип 7) “Карта памяти”:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };
  <p>Далее следует массив из 16 элементов следующей структуры, которые отвечают
    за сегменты адресного пространства размером 4&nbsp;Кб, последний сегмент служит для
    хранения режимов работы контроллера АльтПро:</p>
  <p class="pstruc"><span class="keywd">struct BKMEMBank_Type</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">BOOL</span> </td>
      <td width="15%"><span class="varnm">bReadable</span>;</td>
      <td width="70%">- флаг, указывающий что память доступна для
        чтения</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">BOOL</span> </td>
      <td><span class="varnm">bWritable</span>;</td>
      <td>- флаг, указывающий что память доступна для
        записи</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">int</span> </td>
      <td><span class="varnm">nBank</span>;</td>
      <td>- номер банка памяти 4&nbsp;kb </td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">int</span> </td>
      <td><span class="varnm">nPage</span>;</td>
      <td>- страница памяти БК11 == nBank &gt;&gt; 2 </td>
    </tr>
    <tr valign="top">
      <td></td>
      <td><span class="keywd">int</span> </td>
      <td><span class="varnm">nOffset</span>;</td>
      <td>- смещение в массиве == nBank &lt;&lt; 12 </td>
    </tr>
  </table>
  };
  <p>И затем следует один элемент следующей структуры, который сохраняет информацию
    о типе FDD контроллера и режимах работы контроллеров АльтПро.</p>
  <p class="pstruc"><span class="keywd">struct ConfBKModel_Type</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">nBKModel</span>;</td>
      <td width="70%">- модель БК, для конфигуратора</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td nowrap><span class="varnm">nAltProMemBank</span>;</td>
      <td>- код подключения страницы памяти контроллера
        для записи</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">nExtCodes</span>;</td>
      <td>- доп. коды контроллера, такие как 10 - подключение бейсика
        и 4 - блокировка регистров 177130 и 177132 по чтению (для простоты ПЗУ
        бейсика включается только в режиме 020. В остальных режимах не имеет смысла,
        хотя на реальной железке технически возможно)</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">nAltProMode</span>;</td>
      <td>- код режима контроллера</td>
    </tr>
  </table>
  };
  <h3>Формат тега MSF_BLOCKTYPE_BASEMEMORY11M (Тип 8) “Блок памяти БК 11М, включая<br />
    доп. ПЗУ + ПЗУ контроллера А16М и доп. ОЗУ”:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };
  <p>Далее следует массив размером 0700000 байт содержащий всю указанную память.</p>
  <h3>Формат тега MSF_BLOCKTYPE_MEMORY_SMK512 (Тип 9) “Блок памяти ОЗУ контроллера СМК-512”:</h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };
  <p>Далее следует массив размером 512&nbsp;-&nbsp;16&nbsp;Кбайт содержащий всю
    указанную память (первые 16&nbsp;Кбайт входят в блок MSF_BLOCKTYPE_BASEMEMORY11M).</p>
  <h3>Формат тега MSF_BLOCKTYPE_CONFIG (Тип 10) “Конфигурация”: </h3>
  <p class="pstruc"><span class="keywd">struct MSF_BLOCK_HEADER</span></p>
  {
  <table cellspacing="0" border="0" cellpadding="4" width="720">
    <tr valign="top">
      <td width="5%">&nbsp;</td>
      <td width="10%"><span class="keywd">DWORD</span> </td>
      <td width="15%"><span class="varnm">type</span>;</td>
      <td width="70%">&nbsp;</td>
    </tr>
    <tr valign="top">
      <td>&nbsp;</td>
      <td><span class="keywd">DWORD</span> </td>
      <td><span class="varnm">length</span>;</td>
      <td>&nbsp;</td>
    </tr>
  </table>
  };
  <p>Довольно сложный блок. Сперва формируется массив в памяти содержащий содержимое ini файла конфигурации. Определяется его размер, и затем сохраняется в виде бинарного массива. Размер переменный.</p>
  <p>&nbsp;</p>
  <p>Последовательности тегов для конфигураций создаваемых эмулятором версии 3.x.
    Хотя порядок тегов может быть произвольным, в реальных файлах MSF теги идут
    именно так:</p>
  <h3>1 – БК 0010(01) с БЕЙСИКом “Вильнюс 1986”</h3>
  <table border="1" cellspacing="1" cellpadding="4" width="720">
    <tr valign="top">
      <th width="10%"> Тип</th>
      <th width="90%"> Название</th>
    </tr>
    <tr valign="top">
      <td>Hdr</td>
      <td>Заголовочный тег</td>
    </tr>
    <tr valign="top">
      <td>2</td>
      <td>Preview</td>
    </tr>
    <tr valign="top">
      <td>10</td>
      <td>Config</td>
    </tr>
    <tr valign="top">
      <td>1</td>
      <td>Регистры процессора</td>
    </tr>
    <tr valign="top">
      <td>6</td>
      <td>Системные регистры и порты</td>
    </tr>
    <tr valign="top">
      <td>7</td>
      <td>Карта памяти </td>
    </tr>
    <tr valign="top">
      <td>0</td>
      <td>Основная память 64К</td>
    </tr>
  </table>
  <h3>2 – БК 0010(01) с блоком МСТД</h3>
  <table border="1" cellspacing="1" cellpadding="4" width="720">
    <tr valign="top">
      <th width="10%"> Тип</th>
      <th width="90%"> Название</th>
    </tr>
    <tr valign="top">
      <td>Hdr</td>
      <td>Заголовочный тег</td>
    </tr>
    <tr valign="top">
      <td>2</td>
      <td>Preview</td>
    </tr>
    <tr valign="top">
      <td>10</td>
      <td>Config</td>
    </tr>
    <tr valign="top">
      <td>1</td>
      <td>Регистры процессора</td>
    </tr>
    <tr valign="top">
      <td>6</td>
      <td>Системные регистры и порты</td>
    </tr>
    <tr valign="top">
      <td>7</td>
      <td>Карта памяти </td>
    </tr>
    <tr valign="top">
      <td>0</td>
      <td>Основная память 64К</td>
    </tr>
  </table>
  <h3>3 – БК 0010(01) с дополнительным блоком ОЗУ 32Кб</h3>
  <table border="1" cellspacing="1" cellpadding="4" width="720">
    <tr valign="top">
      <th width="10%"> Тип</th>
      <th width="90%"> Название</th>
    </tr>
    <tr valign="top">
      <td>Hdr</td>
      <td>Заголовочный тег</td>
    </tr>
    <tr valign="top">
      <td>2</td>
      <td>Preview</td>
    </tr>
    <tr valign="top">
      <td>10</td>
      <td>Config</td>
    </tr>
    <tr valign="top">
      <td>1</td>
      <td>Регистры процессора</td>
    </tr>
    <tr valign="top">
      <td>6</td>
      <td>Системные регистры и порты</td>
    </tr>
    <tr valign="top">
      <td>7</td>
      <td>Карта памяти </td>
    </tr>
    <tr valign="top">
      <td>0</td>
      <td>Основная память 64К</td>
    </tr>
    <tr valign="top">
      <td>4</td>
      <td>Страницы расширенной памяти 32К</td>
    </tr>
  </table>
  <h3>4 – БК 0010(01) со стандартным КНГМД и контроллером A16M с ДОЗУ 16К:</h3>
  <p> (дело в том, что стандартный КНГМД строится на основе А16М с отключенным функционалом переключения страниц и жёстко закреплённым стандартным режимом. А весь код обработки один.)</p>
  <table border="1" cellspacing="1" cellpadding="4" width="720">
    <tr valign="top">
      <th width="10%"> Тип</th>
      <th width="90%"> Название</th>
    </tr>
    <tr valign="top">
      <td>Hdr</td>
      <td>Заголовочный тег</td>
    </tr>
    <tr valign="top">
      <td>2</td>
      <td>Preview</td>
    </tr>
    <tr valign="top">
      <td>10</td>
      <td>Config</td>
    </tr>
    <tr valign="top">
      <td>1</td>
      <td>Регистры процессора</td>
    </tr>
    <tr valign="top">
      <td>6</td>
      <td>Системные регистры и порты</td>
    </tr>
    <tr valign="top">
      <td>7</td>
      <td>Карта памяти </td>
    </tr>
    <tr valign="top">
      <td>0</td>
      <td>Основная память 64К</td>
    </tr>
    <tr valign="top">
      <td>3</td>
      <td>Блок расширенной памяти 16К + 8К КНГМД</td>
    </tr>
  </table>
  <h3>5 – БК 0010(01) с контроллером СМК-512 с ДОЗУ 512К</h3>
  <table border="1" cellspacing="1" cellpadding="4" width="720">
    <tr valign="top">
      <th width="10%"> Тип</th>
      <th width="90%"> Название</th>
    </tr>
    <tr valign="top">
      <td>Hdr</td>
      <td>Заголовочный тег</td>
    </tr>
    <tr valign="top">
      <td>2</td>
      <td>Preview</td>
    </tr>
    <tr valign="top">
      <td>10</td>
      <td>Config</td>
    </tr>
    <tr valign="top">
      <td>1</td>
      <td>Регистры процессора</td>
    </tr>
    <tr valign="top">
      <td>6</td>
      <td>Системные регистры и порты</td>
    </tr>
    <tr valign="top">
      <td>7</td>
      <td>Карта памяти </td>
    </tr>
    <tr valign="top">
      <td>0</td>
      <td>Основная память 64К</td>
    </tr>
    <tr valign="top">
      <td>3</td>
      <td>Блок расширенной памяти 16К + 8К КНГМД</td>
    </tr>
    <tr valign="top">
      <td>9</td>
      <td> Блок памяти ОЗУ контроллера СМК-512</td>
    </tr>
  </table>
  <h3>6,7,8 – БК 0011М без FDD, со стандартным FDD, с контроллером
    A16M с ДОЗУ 16К</h3>
  <table border="1" cellspacing="1" cellpadding="4" width="720">
    <tr valign="top">
      <th width="10%"> Тип</th>
      <th width="90%"> Название</th>
    </tr>
    <tr valign="top">
      <td>Hdr</td>
      <td>Заголовочный тег</td>
    </tr>
    <tr valign="top">
      <td>2</td>
      <td>Preview</td>
    </tr>
    <tr valign="top">
      <td>10</td>
      <td>Config</td>
    </tr>
    <tr valign="top">
      <td>1</td>
      <td>Регистры процессора</td>
    </tr>
    <tr valign="top">
      <td>6</td>
      <td>Системные регистры и порты</td>
    </tr>
    <tr valign="top">
      <td>7</td>
      <td>Карта памяти </td>
    </tr>
    <tr valign="top">
      <td>8</td>
      <td>Весь блок памяти БК 11М, включая доп. ПЗУ + ПЗУ контроллера
        А16М и доп. ОЗУ</td>
    </tr>
  </table>
  <h3>9 – БК 0011М с контроллером СМК-512 с ДОЗУ 512К</h3>
  <table border="1" cellspacing="1" cellpadding="4" width="720">
    <tr valign="top">
      <th width="10%"> Тип</th>
      <th width="90%"> Название</th>
    </tr>
    <tr valign="top">
      <td>Hdr</td>
      <td>Заголовочный тег</td>
    </tr>
    <tr valign="top">
      <td>2</td>
      <td>Preview</td>
    </tr>
    <tr valign="top">
      <td>10</td>
      <td>Config</td>
    </tr>
    <tr valign="top">
      <td>1</td>
      <td>Регистры процессора</td>
    </tr>
    <tr valign="top">
      <td>6</td>
      <td>Системные регистры и порты</td>
    </tr>
    <tr valign="top">
      <td>7</td>
      <td>Карта памяти </td>
    </tr>
    <tr valign="top">
      <td>8</td>
      <td>Весь блок памяти БК 11М, включая доп. ПЗУ + ПЗУ контроллера
        А16М и доп. ОЗУ </td>
    </tr>
    <tr valign="top">
      <td>9</td>
      <td> Блок памяти ОЗУ контроллера СМК-512</td>
    </tr>
  </table>
</div>
</body>
</html>
